package futbol.tacticas.concursantes2007.JavaTito;

import futbol.General;
import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.awt.Point;
import java.util.Vector;
import java.math.*;
import futbol.tacticas.*;

/* Equipo: JavaTito
 * Autor: Clementa Acosta
 */
public final class TacticaJavaTito implements Tactica {
     Point pBola;
     int  jCerc;
     Point jCont[];
     Point jug[];

     private int nValores[][]={
          {-150,0,4},  
          {-120,-40,4},  
          {-120,40,4}, 
          {-70, 20,4},  
          {-70,-20,4},  
          
          {105, 60, 7},  
          {105, -60,7},  
          {95, 30, 7}, 
          {95, -30,7},  
          {80, 8,7},  
          {80,-8,7} 
     };

     private double jugLastPos[][];
     
     public Color getColor1() {
          return Color.blue;
     }
     public Color getColor2() {
          return Color.black;
     }
     public String getNombre() {
          return "JavaTito";
     }
     public Color getColorNumero() {
          return Color.white;
     }
     public int getFuerza(int n) {
          return nValores[n][2];
     }
     public int getXInicial(int n) {
          jugLastPos[n][0]= nValores[n][0];
          return nValores[n][0];
     }
     public int getYInicial(int n) {
          jugLastPos[n][1]= nValores[n][1];
          return nValores[n][1];
     }
     public Vector<Comando> getComandos(SituacionJugadores sj) {
          Vector<Comando> com=new Vector();
          
          jCont=sj.getContrario();
          jug= sj.getMisJugadores();
          
          pBola=sj.getBola();
          jCerc= sj.getMasCercanoDeBola();
          boolean tieneBola= false;
          if(General.getDistancia(pBola.x, pBola.y, jug[jCerc].x, jug[jCerc].y)<10)
               tieneBola=true;
          
          int jSig= sj.getSiguienteJugador(jCerc);
          if(jSig==-1)
               jSig= sj.getMiJugadorMasCerca(pBola.x, pBola.y);
          double distJS=999.9;
          if(jSig>-1)
               distJS= General.getDistancia(jug[jCerc].x, jug[jCerc].y, jug[jSig].x, jug[jSig].y);
          
          for (int n=0;n<11;n++)
               com.add(new ComandoIrA(n,jugLastPos[n][0], jugLastPos[n][1]));

          double angBola=0.0;
          int cont= sj.getContrarioMasCerca(-100, -70);
          if(jCont[cont].x < -40){
               angBola = General.getAngulo(jCont[cont].x, jCont[cont].y, pBola.x, pBola.y);
               com.add(new ComandoIrA(1, jCont[cont].x+11*Math.cos(angBola), jCont[cont].y+11*Math.sin(angBola)));
          }
          cont= sj.getContrarioMasCerca(-100, 70);
          if(jCont[cont].x < -40){
               angBola = General.getAngulo(jCont[cont].x, jCont[cont].y, pBola.x, pBola.y);
               com.add(new ComandoIrA(2, jCont[cont].x+11*Math.cos(angBola), jCont[cont].y+11*Math.sin(angBola)));
          }
          cont= sj.getContrarioMasCerca(-50, 20);
          if(jCont[cont].x < 0){
               angBola = General.getAngulo(jCont[cont].x, jCont[cont].y, pBola.x, pBola.y);
               com.add(new ComandoIrA(3, jCont[cont].x+11*Math.cos(angBola), jCont[cont].y+11*Math.sin(angBola)));
          }
          cont= sj.getContrarioMasCerca(-50, -20);
          if(jCont[cont].x < 0){
               angBola = General.getAngulo(jCont[cont].x, jCont[cont].y, pBola.x, pBola.y);
               com.add(new ComandoIrA(4, jCont[cont].x+11*Math.cos(angBola), jCont[cont].y+11*Math.sin(angBola)));
          }
          for(int i=10; i>=5; i--){
               cont= sj.getContrarioMasCerca(i);
               if(General.getDistancia(jCont[cont].x, jCont[cont].y, jug[i].x, jug[i].y) < 15 && jCont[cont].x > 40){
                    int offset= 30;
                    if( nValores[i][1]<0)
                         offset= offset*-1;
                    if(jug[i].y==nValores[i][1]+offset)
                         offset= offset*-1;
                    jugLastPos[i][1]= nValores[i][1]+offset;
               }
               else
                     jugLastPos[i][1]= nValores[i][1];
          }
          
          com.add(new ComandoIrA(jCerc, pBola.x, pBola.y));

          if(pBola.x< -130 && pBola.y<50 && pBola.y>-50)
               com.add(new ComandoIrA(0,pBola.x, pBola.y));
          else{
               int y=(int)(pBola.y/2);
               if (y<-20) y=-20;
               if (y>20) y=20;
               com.add(new ComandoIrA(0,nValores[0][0], y));
          }
          if(tieneBola){
               if(jCerc==0 && (pBola.x< -125 && (pBola.y>-60 && pBola.y<60))){
                    if(pBola.y > 0)
                         com.add(new ComandoGolpearBola(jCerc, pBola.x+10, pBola.y+80));
                    else
                         com.add(new ComandoGolpearBola(jCerc, pBola.x+10, pBola.y-80));

               } else if((jCerc==1 || jCerc==2 || jCerc==3|| jCerc==4)){
                    if(pBola.x < -110 && pBola.y>-70 && pBola.y<70){
                         if(pBola.y > 0)
                              com.add(new ComandoGolpearBola(jCerc, pBola.x+10, pBola.y+70));
                         else
                              com.add(new ComandoGolpearBola(jCerc, pBola.x+10, pBola.y-70));
                    } else if(pBola.x>=70){
                         if(distJS<55){
                              com.add(new ComandoPase(jCerc, jSig));
                              com.add(new ComandoIrA(jCerc,jugLastPos[jCerc][0], jugLastPos[jCerc][1]));
                         }  else if(pBola.x>=115)
                              com.add(new ComandoGolpearBola(jCerc, 110, 0));
                         else                             
                              regatear(com, sj, 140, 0, false);
                    } else if(pBola.x<90){
                         if(distJS<45 && (jSig==3 || jSig==4)){
                              com.add(new ComandoPase(jCerc, jSig));
                              com.add(new ComandoIrA(jCerc,jugLastPos[jCerc][0], jugLastPos[jCerc][1]));
                         }
                         else
                              regatear(com, sj, 100, pBola.y>0?100:-100, false);
                    }
               } else if(jCerc>=5)
                    com.add(new ComandoGolpearBola(jCerc, 168, 0));
          }
          return com;
     }

     void regatear(Vector com, SituacionJugadores sj, int x, int y, boolean usarBanda){
          double ang= General.getAngulo(jug[jCerc].x, jug[jCerc].y, x, y);
          if(pBola.y==y && usarBanda)
               ang=0.0;
          int golpe= 30;
          double nDir[][]={{golpe*Math.cos(ang),golpe*Math.sin(ang)},
          {golpe*Math.cos(ang+Math.PI/4),golpe*Math.sin(ang+Math.PI/4)},
          {golpe*Math.cos(ang-Math.PI/4),golpe*Math.sin(ang-Math.PI/4)},
          {golpe*Math.cos(ang+Math.PI/2),golpe*Math.sin(ang+Math.PI/2)},
          {golpe*Math.cos(ang-Math.PI/2),golpe*Math.sin(ang-Math.PI/2)},
          {golpe*Math.cos(ang+Math.PI*3/4),golpe*Math.sin(ang+Math.PI*3/4)},
          {golpe*Math.cos(ang-Math.PI*3/4),golpe*Math.sin(ang-Math.PI*3/4)},
          {golpe*Math.cos(ang+Math.PI),golpe*Math.sin(ang+Math.PI)}};
          
          int nDis=golpe-2;
          if (General.getDistancia(pBola.x, pBola.y, jug[jCerc].x, jug[jCerc].y)<10){
               
               double xN= pBola.x+golpe;
               double yN= pBola.y;
               for (int n=0;n<nDir.length;n++){
                    xN=  jug[jCerc].x+nDir[n][0];
                    yN=  jug[jCerc].y+nDir[n][1];                    
                    if(xN >160 || xN<-160 || yN<-120 || yN >120)
                         continue;
                    int nJC= sj.getContrarioMasCerca(xN, yN);
                    if (General.getDistancia(xN, yN, jCont[nJC].x, jCont[nJC].y)>nDis)
                         break;
               }
               com.add(new ComandoGolpearBola(jCerc, xN, yN));
          }

     }
     
     /** Constructor. */
     public TacticaJavaTito() {
          jugLastPos= new double[11][2];
          
     }
} // TacticaTitoTenerife